package clases.personal;

import CapaDatos.DataSource;
import CapaDatos.Sql;
import clases.general.Persona;
import global.Dialogos;
import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Personal extends Persona {

    private String profesion;
    private String estadocivil;
    private String fechanacimiento;
    private String sexo;
    private String celular;
    private String correo;
    private String area;
    private String direccion2;
    private String fechaingreso;
    private String fechasalida;
    private String sql;
    private final DataSource dt;
    public Cargo cargo;

    public Personal() {
        dt = new DataSource();
        cargo = new Cargo();
    }

    public String getFechanacimiento() {
        return fechanacimiento;
    }

    public void setFechanacimiento(String fechanacimiento) {
        this.fechanacimiento = fechanacimiento;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getProfesion() {
        return profesion;
    }

    public void setProfesion(String profesion) {
        this.profesion = profesion;
    }

    public String getEstadocivil() {
        return estadocivil;
    }

    public void setEstadocivil(String estadocivil) {
        this.estadocivil = estadocivil;
    }

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }

    public String getDireccion2() {
        return direccion2;
    }

    public void setDireccion2(String direccion2) {
        this.direccion2 = direccion2;
    }

    public String getFechaingreso() {
        return fechaingreso;
    }

    public void setFechaingreso(String fechaingreso) {
        this.fechaingreso = fechaingreso;
    }

    public String getFechasalida() {
        return fechasalida;
    }

    public void setFechasalida(String fechasalida) {
        this.fechasalida = fechasalida;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    private int getMax() {
        return Sql.getMax("IDINGRESO", "INGRESO", true);
    }

    public void DestituirEmpleado() {
        if (Sql.actualizar("UPDATE PERSONAL SET ESTADO=FALSE "
                + "WHERE CEDULARUC='" + this.getCedulaRuc() + "'") == true
                && Sql.actualizar("UPDATE INGRESO SET FECHASALIDA='" + this.fechasalida + "' "
                        + "WHERE CEDULARUC='" + this.getCedulaRuc() + "'")) {
            global.Mensajes.mostrarMensaje("Correcto!", "Personal destituido correctamente", 1);
        } else {
            Dialogos.Error("Error al destituir el empleado");
        }

    }

    public void RecontratarEmpleado() {
        sql = "UPDATE PERSONAL SET ESTADO=TRUE "
                + "WHERE CEDULARUC='" + this.getCedulaRuc() + "'";
        if (Sql.actualizar(sql) == true) {
            global.Mensajes.mostrarMensaje("Correcto!", "Personal recontratado correctamente", 1);
        } else {
            Dialogos.Error("Error al recontratar el empleado");
        }

    }

    public boolean cambiarestadoIngreso() {
        sql = "UPDATE INGRESO SET ESTADO=FALSE "
                + "WHERE ESTADO=TRUE AND CEDULARUC='" + this.getCedulaRuc() + "'";
        if (Sql.actualizar(sql) == true) {
            return true;
        } else {
            Dialogos.Error("Error al actualizar el estado del sueldo");
            return false;
        }
    }

    public boolean GuardarIngreso() {
        if (Sql.insertar("INSERT INTO INGRESO (IDINGRESO, CEDULARUC, FECHAINGRESO, ESTADO) "
                + "VALUES(" + this.getMax() + ", '" + this.getCedulaRuc() + "', "
                + "'" + this.fechaingreso + "', TRUE)") == true) {

            return true;
        } else {
            Dialogos.Error("Error al guardar el Ingreso");
            return false;
        }
    }

    public boolean actualizarIngreso() {
        sql = "UPDATE INGRESO SET FECHAINGRESO='" + this.fechaingreso + "' "
                + "WHERE CEDULARUC='" + this.getCedulaRuc() + "' AND ESTADO=TRUE";

        if (Sql.actualizar(sql) == true) {
            // global.Mensajes.mostrarMensaje("Correcto!", "Datos actualizados correctamente", 1);
            return true;
        } else {
            Dialogos.Error("Error al actualizar el ingreso");
            return false;
        }
    }

    public boolean guardarEmpleado() {
        if (this.ExistenciaEmpleado() == true) {
            Dialogos.Error("El Personal ya existe");
            return false;
        } else if (this.guardarPersona() == true
                && Sql.insertar("INSERT INTO PERSONAL VALUES ('" + this.getCedulaRuc() + "', "
                        + this.cargo.getIdsectorial() + ", '" + this.profesion + "', '"
                        + this.estadocivil + "', '" + this.fechanacimiento + "', "
                        + "'" + this.sexo + "', " + this.celular + ", '" + this.direccion2 + "', "
                        + "'" + this.correo + "', '" + this.area + "', TRUE, " + null + ")") == true) {
            // Dialogos.GuardadoconExito();
            return true;
        } else {
            Dialogos.Error("Error al ingresar el empleado");
            return false;
        }

    }

    public boolean actualizarEmpleado() {
        sql = "UPDATE PERSONAL SET CEDULARUC='" + this.getCedulaRuc() + "', "
                + "IDSECTORIAL=" + this.cargo.getIdsectorial() + ", "
                + "PROFESION='" + this.profesion + "', ESTADOCIVIL='" + this.estadocivil + "', "
                + "FECHANACIMIENTO='" + this.fechanacimiento + "', GENERO='" + this.sexo + "', "
                + "CELULAR='" + this.celular + "', DIRECCION='" + this.direccion2 + "', "
                + "CORREO='" + this.correo + "', AREA='" + this.area + "' "
                + "WHERE CEDULARUC='" + this.getCedulaRuc() + "'";
        if (this.actualizarPersona() == true && Sql.actualizar(sql) == true) {
            // global.Mensajes.mostrarMensaje("Correcto!", "Datos actualizados correctamente", 1);
            return true;
        } else {
            Dialogos.Error("Error al actualizar el empleado");
            return false;
        }
    }

    public boolean ExistenciaEmpleado() {
        sql = "SELECT * FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE PERSONAL.CEDULARUC='" + this.getCedulaRuc() + "'";
        return Sql.isExiste(sql);
    }

    public boolean ExistenciaFotoEmpleado() {
        sql = "SELECT FOTO FROM PERSONAL "
                + "WHERE CEDULARUC='" + this.getCedulaRuc() + "'";
        Sql.getConsulta(sql, dt);
        String foto = "";
        while (dt.next()) {
            foto = dt.getString(1);
        }
        return !"".equals(foto) && foto != null;
    }

    /*public boolean ExistenciaEmpleado(String cedula) {
     if (!cedula.equals(this.getCedulaRuc())) {
     sql = "SELECT * FROM PERSONAL JOIN PERSONA "
     + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
     + "WHERE PERSONAL.CEDULARUC='" + cedula + "' AND PERSONAL.CEDULARUC!='" + this.getCedulaRuc() + "'";
     return Sql.isExiste(sql);
     } else {
     return false;
     }
     }*/
    public String SqlGeneralPersonal() {
        sql = "SELECT PERSONAL.CEDULARUC, CONCAT(APELLIDO,' ',NOMBRE), CARGO, AREA, "
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHASALIDA, 'DD/MM/yyyy'), "
                + "SUELDO, PERSONAL.ESTADO "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN SUELDO ON SUELDO.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE SUELDO.ESTADO=TRUE AND INGRESO.ESTADO=TRUE "
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE))";
        System.out.println(sql);
        return sql;
    }

    public String SqLPersonal(String personal) {
        sql = "SELECT PERSONAL.CEDULARUC, CONCAT(APELLIDO,' ',NOMBRE), CARGO, AREA, "
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHASALIDA, 'DD/MM/yyyy'), "
                + "SUELDO, PERSONAL.ESTADO "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN SUELDO ON SUELDO.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE SUELDO.ESTADO=TRUE AND INGRESO.ESTADO=TRUE "
                + "AND CONCAT(APELLIDO,' ',NOMBRE) LIKE '%" + personal + "%' "
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE))";
        
        return sql;
    }

    public String SqlSueldo(double sueldo) {
        sql = "SELECT PERSONAL.CEDULARUC, CONCAT(APELLIDO,' ',NOMBRE), CARGO, AREA, "
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHASALIDA, 'DD/MM/yyyy'), "
                + "SUELDO, PERSONAL.ESTADO "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN SUELDO ON SUELDO.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE SUELDO.ESTADO=TRUE AND INGRESO.ESTADO=TRUE "
                + "AND SUELDO = " + sueldo + ""
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE))";
        return sql;
    }

    public String SqlFechaIngreso(String fecha) {
        sql = "SELECT PERSONAL.CEDULARUC, CONCAT(APELLIDO,' ',NOMBRE), CARGO, AREA, "
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHASALIDA, 'DD/MM/yyyy'), "
                + "SUELDO, PERSONAL.ESTADO "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN SUELDO ON SUELDO.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE SUELDO.ESTADO=TRUE AND INGRESO.ESTADO=TRUE "
                + "AND TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy') = '" + fecha + "' "
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE))";
        return sql;
    }

    public String SqlFechaSalida(String fecha) {
        sql = "SELECT PERSONAL.CEDULARUC, CONCAT(APELLIDO,' ',NOMBRE), CARGO, AREA,"
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHASALIDA, 'DD/MM/yyyy'), "
                + "SUELDO, PERSONAL.ESTADO "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN SUELDO ON SUELDO.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE SUELDO.ESTADO=TRUE AND INGRESO.ESTADO=TRUE "
                + "AND TO_CHAR(FECHASALIDA, 'DD/MM/yyyy') = '" + fecha + "' "
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE))";
        return sql;
    }

    public String SqlEstado(boolean estado) {
        sql = "SELECT PERSONAL.CEDULARUC, CONCAT(APELLIDO,' ',NOMBRE), CARGO, AREA, "
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHASALIDA, 'DD/MM/yyyy'), "
                + "SUELDO, PERSONAL.ESTADO "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN SUELDO ON SUELDO.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE SUELDO.ESTADO=TRUE AND INGRESO.ESTADO=TRUE "
                + "AND PERSONAL.ESTADO = " + estado + " "
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE))";

        return sql;
    }

    public String SqlCargo(String cargo) {
        sql = "SELECT PERSONAL.CEDULARUC, CONCAT(APELLIDO,' ',NOMBRE), CARGO, AREA, "
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHASALIDA, 'DD/MM/yyyy'), "
                + "SUELDO, PERSONAL.ESTADO "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN SUELDO ON SUELDO.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE SUELDO.ESTADO=TRUE AND INGRESO.ESTADO=TRUE "
                + "AND CARGO = '" + cargo + "' "
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE))";
        return sql;
    }

    private String CambiarBoolean(String dato) {
        if (dato.equals("t")) {
            return "ACTIVO";
        } else {
            return "INACTIVO";
        }
    }

    public void ConsultaEmpleado(DefaultTableModel modelo, JTable tabla, String sql, JLabel Lpaginatotal, JLabel Lpagina, int pagina) {
        modelo = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false;
            }
        };
        tabla.setModel(modelo);
        modelo.addColumn("Nº");
        modelo.addColumn("CEDULA");
        modelo.addColumn("PERSONAL");
        modelo.addColumn("CARGO");
        modelo.addColumn("AREA");
        modelo.addColumn("FECHA INGRESO");
        modelo.addColumn("FECHA SALIDA");
        modelo.addColumn("SUELDO");
        modelo.addColumn("ESTADO");
        DefaultTableCellRenderer centrar = new DefaultTableCellRenderer();
        centrar.setHorizontalAlignment(SwingConstants.RIGHT);
        DefaultTableCellRenderer N = new DefaultTableCellRenderer();
        N.setHorizontalAlignment(SwingConstants.CENTER);
        tabla.getColumnModel().getColumn(7).setCellRenderer(centrar);
        tabla.getColumnModel().getColumn(0).setCellRenderer(N);
        TableColumn columna = new TableColumn();
        columna = tabla.getColumnModel().getColumn(0);
        columna.setPreferredWidth(10);
        columna = tabla.getColumnModel().getColumn(1);
        columna.setPreferredWidth(60);
        columna = tabla.getColumnModel().getColumn(2);
        columna.setPreferredWidth(300);
        columna = tabla.getColumnModel().getColumn(3);
        columna.setPreferredWidth(200);
        columna = tabla.getColumnModel().getColumn(4);
        columna.setPreferredWidth(100);
        columna = tabla.getColumnModel().getColumn(5);
        columna.setPreferredWidth(60);
        columna = tabla.getColumnModel().getColumn(6);
        columna.setPreferredWidth(60);
        columna = tabla.getColumnModel().getColumn(7);
        columna.setPreferredWidth(40);
        columna = tabla.getColumnModel().getColumn(8);
        columna.setPreferredWidth(40);
        sql = objPaginacion.getPaginacion(sql, pagina, 25);
        Sql.getConsulta(sql, dt);

        String[] fila;
        int n = (pagina*25)-24;
        while (dt.next()) {
            fila = new String[9];
            fila[0] = Integer.toString(n);
            fila[1] = dt.getString(1);
            fila[2] = dt.getString(2);
            fila[3] = dt.getString(3);
            fila[4] = dt.getString(4);
            fila[5] = dt.getString(5);
            fila[6] = dt.getString(6);
            fila[7] = "$" + dt.getString(7);
            fila[8] = this.CambiarBoolean(dt.getString(8));

            modelo.addRow(fila);
            n++;
        }
        objPaginacion.actualPagina(Lpagina);
        objPaginacion.totalPaginas(Lpaginatotal);
        tabla.getSelectionModel().setSelectionInterval(0, 0);
    }

    public void llenardatosEmpelado() {
        sql = "SELECT CARGO, PROFESION, ESTADOCIVIL, \n"
                + "TO_CHAR(FECHANACIMIENTO, 'DD/MM/yyyy'), GENERO, "
                + "TO_CHAR(FECHAINGRESO, 'DD/MM/yyyy'), CELULAR, DIRECCION, CORREO, AREA \n"
                + "FROM PERSONAL JOIN SECTORIAL "
                + "ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "JOIN INGRESO ON INGRESO.CEDULARUC=PERSONAL.CEDULARUC "
                + "WHERE INGRESO.ESTADO=TRUE AND "
                + "PERSONAL.CEDULARUC='" + this.getCedulaRuc() + "'";

        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.cargo.setCargo(dt.getString(1));
            this.profesion = dt.getString(2);
            this.estadocivil = dt.getString(3);
            this.fechanacimiento = dt.getString(4);
            this.sexo = dt.getString(5);
            this.fechaingreso = dt.getString(6);
            this.celular = dt.getString(7);
            this.direccion2 = dt.getString(8);
            this.correo = dt.getString(9);
            this.area = dt.getString(10);
        }
    }

    public void listarDocentes(JComboBox cbo) {
        cbo.removeAllItems();
        cbo.addItem("--Seleccione--");
        sql = "SELECT CONCAT(APELLIDO,' ',NOMBRE) "
                + "FROM PERSONAL JOIN PERSONA "
                + "ON PERSONA.CEDULARUC=PERSONAL.CEDULARUC "
                + "JOIN SECTORIAL ON SECTORIAL.IDSECTORIAL=PERSONAL.IDSECTORIAL "
                + "WHERE AREA = 'DOCENTE' AND ESTADO=TRUE "
                + "ORDER BY(CONCAT(APELLIDO,' ',NOMBRE)) DESC";

        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            cbo.addItem(dt.getString(1));
        }
        cbo.setSelectedIndex(0);

    }

    public void comboProfesion(JComboBox combo) {
        sql = "SELECT DISTINCT PROFESION FROM PERSONAL";
        combo.removeAllItems();
        Sql.getConsulta(sql, dt);
        combo.addItem("--Seleccione--");
        while (dt.next()) {
            combo.addItem(dt.getString(1));
        }
    }

    public void comboArea(JComboBox combo) {
        sql = "SELECT DISTINCT AREA FROM PERSONAL";
        combo.removeAllItems();
        Sql.getConsulta(sql, dt);
        combo.addItem("--Seleccione--");
        while (dt.next()) {
            combo.addItem(dt.getString(1));
        }
    }

    public void sacarCedulaDocente(String docente) {
        sql = "SELECT PERSONAL.CEDULARUC FROM PERSONA "
                + "JOIN PERSONAL ON PERSONAL.CEDULARUC=PERSONA.CEDULARUC "
                + "WHERE CONCAT(APELLIDO,' ',NOMBRE)='" + docente + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.setCedulaRuc(dt.getString(1));
        }
    }

    private Image ConvertirImagen(byte[] bytes) throws IOException {
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");
        ImageReader reader = (ImageReader) readers.next();
        Object source = bis;
        ImageInputStream iis = ImageIO.createImageInputStream(source);
        reader.setInput(iis, true);
        ImageReadParam param = reader.getDefaultReadParam();
        return reader.read(0, param);
    }

}
